package cn.damong.controller;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * 微信授权回调转发控制器，用于转发跳转<br>
 * 
 * 主要用途：<br>
 * 实现在浏览端先保存一些cookie，然后跳转到新页面(可以定义延时跳转)<br><br>
 * 比如用户在无需授权页面A，跳转到需要用户授权的页面B，页面的访问顺序变成：<br>
 * A -->  B --> 微信授权链接C  --> 授权回调地址D  --> B<br>
 * A-->B这一步，B无法在用户端再写入cookie, D的处理逻辑中只能通过授权链接C中的state判断需要跳转的地址，这就要求在B-->C这一步持久化B的地址和state的映射关系，加重服务器的负载。
 * 可以修改访问顺序为：<br>
 * A -->  B --> 中间地址E --> 微信授权链接C  --> 授权回调地址D  --> B<br>
 * B通过页面重定向的方式访问E，E向用户端返回一个简单的跳转页面PageE, 
 * PageE可以通过js在用户端写入cookie，然后延时跳转到C，这样D可以直接读取用户端保存的cookie，从而知道需要跳转回B。<br>
 * 
 * E的访问地址就需要用到这个控制器<br>
 * 
 * 本来还可以在A页面上触发访问B之前就将cookie设置好，再访问B，这里用注解做了一层封装，只要在B的业务代码上加上注解就自动完成授权全套的授权流程。
 * 
 * <br>详情先查看微信网页授权的步骤
 * 
 * @author CodingPanda
 * @2019年5月9日 下午9:33:11
 *
 */
@Controller
@RequestMapping(value = "/redirect")
public class RedirectController {
	
	@RequestMapping(value="/", method = RequestMethod.GET)
	public ModelAndView redirect(HttpServletRequest request, String callBackUrl, String targetUrl){
		try {
			callBackUrl = URLDecoder.decode(callBackUrl, "utf-8");
			
			ModelAndView mv = new ModelAndView("url_redirect");
			mv.addObject("callBackUrl", callBackUrl);
			mv.addObject("targetUrl", targetUrl);
			return mv;
		} catch (UnsupportedEncodingException e) {
			return new ModelAndView("500");
		}
		
	}

}
